package com.yaoli.ajob;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by siemens on 4/6/2017.
 *
 * 思想：桶排序
 *
 * 先使用map保存每个数字的个数
 *
 * 然后将申请 空间，这个空间的大小是，整个数组的长度+1，保存 0 到 长度 的 得 每个数字
 *
 * 从后往前遍历这个空间，将这个空间 的list中的值保存到结果中。
 *
 * 只要出现同一位置出现多次的结果 都可以使用该思想。
 */
public class _347_TopKFrequentElements {
    public static void main(String[] args) {
        _347_TopKFrequentElements topKFrequentElements = new _347_TopKFrequentElements();

        int [] nums = {4,1,-1,2,-1,2,3};

        topKFrequentElements.topKFrequent(nums,2);
    }

    public List<Integer> topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();

        for(int i = 0 ; i < nums.length ; i ++){
            if(!map.containsKey(nums[i])){
                map.put(nums[i],1);
            }else{
                map.put(nums[i],map.get(nums[i]) + 1);
            }
        }
        //数组里面存着 是什么数字

        //长度为 nums的长度 + 1
        // 比如nums的长度为 10 ，那么 就要申请 11 个空间的数组， 为 0 到 11,
        List<Integer> bu []= new ArrayList[nums.length + 1];

        for(Integer i : map.keySet()){
            int fre = map.get(i);
            if( bu[fre] == null ){
                bu[fre] = new ArrayList<Integer>();
            }
            bu[fre].add(i);
        }


        List<Integer> list = new ArrayList<Integer>();

        for(int i = bu.length - 1 , t = 1 ; i >= 0 && t <= k ; i -- ){
            for(int j = 0 ; bu[i] != null && j < bu[i].size() ; j++){
                list.add(bu[i].get(j));
                t++;
            }
        }

        return list;
    }

}
